package fachada;

import contas.CadastroContas;
import contas.Conta;
import contas.RepositorioContas;
import exceptions.ContaJaCadastradaException;
import exceptions.ContaNaoEncontradaException;
import exceptions.SaldoInsuficienteException;

public class Banco implements IBanco  {

	private static final long serialVersionUID = 1L;

	private CadastroContas contas;

	private static IBanco singleton;

	// Padrao de projeto Singleton
	public static IBanco getInstance(RepositorioContas repositorio) {
		if (singleton == null) {
			singleton = new Banco(repositorio);
		}
		return singleton;
	}
	
	private Banco(RepositorioContas repositorio)  {
		contas = new CadastroContas(repositorio);
	}
	
	/* (non-Javadoc)
	 * @see fachada.IBanco#cadastrar(contas.Conta)
	 */
	public void cadastrar(Conta conta) throws ContaJaCadastradaException {
		contas.cadastrar(conta);
	}

	/* (non-Javadoc)
	 * @see fachada.IBanco#creditar(java.lang.String, double)
	 */
	public void creditar(String numero, double valor)
		throws ContaNaoEncontradaException {
		contas.creditar(numero, valor);
	}

	/* (non-Javadoc)
	 * @see fachada.IBanco#debitar(java.lang.String, double)
	 */
	public void debitar(String numero, double valor)
		throws ContaNaoEncontradaException, SaldoInsuficienteException {
		contas.debitar(numero, valor);
	}

	/* (non-Javadoc)
	 * @see fachada.IBanco#transferir(java.lang.String, java.lang.String, double)
	 */
	public void transferir(String numeroDe, String numeroPara, double valor)
		throws ContaNaoEncontradaException, SaldoInsuficienteException {
		contas.transferir(numeroDe, numeroPara, valor);
	}

	/* (non-Javadoc)
	 * @see fachada.IBanco#saldo(java.lang.String)
	 */
	public double saldo(String numero) throws ContaNaoEncontradaException {
		return contas.saldo(numero);
	}
	
	/* (non-Javadoc)
	 * @see fachada.IBanco#remover(java.lang.String)
	 */
	public void remover(String numero) throws ContaNaoEncontradaException {
		contas.remover(numero);
	}
	
	/* (non-Javadoc)
	 * @see fachada.IBanco#existe(java.lang.String)
	 */
	public boolean existe(String numero) {
		return contas.existe(numero);
	}

	/* (non-Javadoc)
	 * @see fachada.IBanco#procurar(java.lang.String)
	 */
	public Conta procurar(String numero) throws ContaNaoEncontradaException {
		return contas.procurar(numero);
	}

	/* (non-Javadoc)
	 * @see fachada.IBanco#atualizar(contas.Conta)
	 */
	public void atualizar(Conta conta) throws ContaNaoEncontradaException {
		contas.atualizar(conta);
	}

}